package com.itbaizhan;


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.UUID;

/*与fileUpload02.html相关*/
/*文件上传*/
//路径要与html的action一样
@WebServlet("/fileUpload02.do")
//上传文件注解  如果不配置参数时，直接写就可以  有了注解就可以用Part对象处理文件上传
@MultipartConfig
public class FileUploadServlet02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //因为在Filter设置了请求编码，当启动请求时，Filter会自动启动，对请求进行过虑
        //所以这里不用设置请求编码
        //如果文件描述有中文，设置编码
       // req.setCharacterEncoding("utf-8");
        //获取文件描术
        String desc = req.getParameter("desc");
        //获取上传的文件   html中的form表单中的上传文件的name
        Part part = req.getPart("file");

        //要防止文件名相同，避免上传后文件被其他的覆盖  新的文件名保留扩展名（.jar等）
        //生成新的文件名
        //UUID.randomUUID 用toString()转为字符串
        //截取文件名中最后一个 .    part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf("."))
        String newName = UUID.randomUUID().toString()+part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf("."));
        //路径的转换  作用：能夸平台使用
        //ServletContext 全局性  相对路径转为绝对路径
        ServletContext servletContext = this.getServletContext();
        //相对路径转为绝对路径
        String realPart = servletContext.getRealPath("image/"+newName);
        System.out.println(realPart);
        //保存文件到务服器
        part.write(realPart);

        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter pw = resp.getWriter();
        pw.println(desc);
        pw.flush();
        pw.close();



    }
}
/*文件上传
在Servlet3.0之前的版本中如果实现文件上传需要依赖apache的Fileupload组件
，在Servlet3.0以及之后的版本中提供了Part对象处理文件上传，所以不在需要
额外的添加Fileupload组件。

在Servlet3.0以及之后的版本中实现文件上传时必须要在Servlet中开启多参数
配置：
web.xml

1<multipart-config>
2    <file-size-threshold></file-size-threshold>
3    <location></location>
4    <max-file-size></max-file-size>
5    <max-request-size></max-request-size>
6</multipart-config>

元素名	                        类型	            描述
<file-size-threshold>            int	    当数据量大于该值时，内容将被写入临时文件。
<location>                      String	   存放生成的临时文件地址
<max-file-size>                 long	   允许上传的文件最大值（byte）。默认值为 -1，表示没有限制
<max-request-size>              long	  一个 multipart/form-data请求能携带的最大字节数（byte），默认值为 -1，表示没有限制。


@MultipartConfig

属性名	            类型	            描述
fileSizeThreshold	int	        当数据量大于该值时，内容将被写入临时文件。
location	        String	    存放生临时成的文件地址
maxFileSize	        long	    允许上传的文件最大值（byte）。默认值为 -1，表示没有限制
maxRequestSize	    long	    一个 multipart/form-data请求能携带的最大字节数（byte），默认值为 -1，表示没有限制。

Part对象中常用的方法

long getSize()
上传文件的大小

String getSubmittedFileName()
上传文件的原始文件名

String getName()
获取<input name="upload" ...>标签中name属性值

InputStream getInputStream()
获取上传文件的输入流

void write(String path)
保存文件至服务器
*/